<?php
App::import('Vendor', 'xmlparser/xexcelxmlparser');
App::import('Vendor', 'cryptastic');
/*
    De chay duoc doan controller nay can imp cac goi sau:
    1/Vendor/xmlparser/xexcelxmlparser
    2/Vendor/cryptastic
    3/plugin/file_upload
    
    Truoc khi chay can tao 1 table ghi_nhan_tai_lens, tao MVC cho bang nay
*/
class GhiNhanTaiLensController extends AppController {
    var $name = 'GhiNhanTaiLens';
    var $helpers = array('Html', 'Form', 'FileUpload.FileUpload');
    var $components = array('FileUpload.FileUpload', 'Auth', 'Session');
    var $uses = array('GhiNhanTaiLen', 'Nongho'
        ,'Ketqua'
        ,'KqBd'
        ,'NongHo'
        ,'PDtBd'
        ,'PhieuDt'
        ,'SdPhanbon'
        ,'SdungThuoc'
        ,'Sotay'
        ,'Thoitiet'      
        ,'TsTt'     
        ,'Dvtinh'
        ,'ChicucBvtv'
        ,'DiemDt'
        ,'Doituong'
        ,'DtLoaidt'
        ,'Gionglua'
        ,'HcThuoc'
        ,'Hoatchat'
        ,'Huyen'
        ,'LoaiDt'
        ,'Loaiphan'
        ,'MuaVue'
        ,'Nam'
        ,'NdDt'
        ,'Nss'
        ,'Thongso'
        ,'Thuoc'
        ,'Tinh'
        ,'Trambvtv'
        ,'User',
        'Xa'
        );
            
            
    var $paginate = array(                        
                        'limit' => 25,
                        'order' => array(
                            'GhiNhanTaiLen.thoi_diem_thay_doi' => 'desc'
                        )
                    );
    function beforeFilter(){
        parent::beforeFilter();
        $this->FileUpload->allowedTypes(array('ctu'));
        $this->FileUpload->uploadDir('files');
        $this->FileUpload->fileModel(null);
    }
   
   function index(){
    //set dinh dang ngay theo khu vuc
        date_default_timezone_set('UTC'); 
        if(!empty($this->data)){
            if($this->FileUpload->success){ //Tải file thành công
                ini_set('memory_limit','1024M');
                $client_filename = $this->data['file'][0]['name'];            
            
                // Kiểm tra file tải lên có tồn tại chưa (trong trường hợp người dùng tải lại file cũ)
                $save_data = $this->GhiNhanTaiLen->find('first', array('conditions'=> 
                                                                array('ten_tap_tin_client'=>$client_filename)));            
                
                $date = getdate();
                $strdate = $date['year'].'-'.$date['mon'].'-'.$date['mday'].' '.
                            $date['hours'].':'.$date['minutes'].':'.$date['seconds'];
                
                $server_filename =  $this->Auth->user('canbo_id').'_'.
                                            $date['year'].'-'.$date['mon'].'-'.$date['mday'].'_'.
                                            $date['hours'].'-'.$date['minutes'].'-'.$date['seconds'].'.xls';                              
                //Ghi nhận lại các thông tin của file vừa được tải lên
                if(empty($save_data)){                    
                    $this->GhiNhanTaiLen->create();
                    $save_data['GhiNhanTaiLen']['ten_tap_tin_client'] = $client_filename;
                    $save_data['GhiNhanTaiLen']['ten_tap_tin_server'] = $server_filename;
                    $save_data['GhiNhanTaiLen']['kieu_tap_tin'] = $this->data['file'][0]['type'];
                    $save_data['GhiNhanTaiLen']['do_lon_tap_tin'] = $this->data['file'][0]['size'];            
                    $save_data['GhiNhanTaiLen']['thoi_diem_tao'] = $strdate;//date('Y-m-d H:m:s');
                    $save_data['GhiNhanTaiLen']['thoi_diem_thay_doi'] = $strdate;//date('Y-m-d H:m:s');
                    $save_data['GhiNhanTaiLen']['canbo_id'] = $this->Auth->user('canbo_id');                
                }else{
                    $save_data['GhiNhanTaiLen']['thoi_diem_thay_doi'] = $strdate;//date('Y-m-d H:m:s', $date[0]);
                    $save_data['GhiNhanTaiLen']['ten_tap_tin_server'] = $server_filename;
                    //trường hợp tải lại file đã tồn tại rồi ==> xóa file cũ
                    @unlink(WWW_ROOT.DS.'files'.DS.$save_data['GhiNhanTaiLen']['ten_tap_tin_server']);                       
                }
                // Lúc này chưa cập nhật dữ liệu trong file backup nên tình trạng là thất bại
                $save_data['GhiNhanTaiLen']['tinh_trang'] = 0;                
            
                // Giải mã nội dung tập tin
                //$decrypt = new cryptastic;
                $input = file_get_contents(WWW_ROOT.'files'.DS.$client_filename);
               
               /*                              
                $output = $decrypt->decrypt($input, true);
                if($output === false){
                    $this->Session->setFlash('Giải mã dữ liệu bị lỗi!');
                    $this->redirect(array('action'=>'index'));
                }
                 */           
                //đặt lại tên file backup mới cho thống nhất
                $newfilename = WWW_ROOT.'files'.DS.$server_filename;
                //@rename(WWW_ROOT.'files'.DS.$client_filename, $newfilename);
                                
              //  file_put_contents($newfilename, $output);                
                file_put_contents($newfilename, $input); 
                if(!$this->GhiNhanTaiLen->save($save_data)){
                    $this->Session->setFlash('Lỗi lưu trữ lên cơ sở dữ liệu!');
                    $this->redirect(array('action'=>'index'));                    
                }else{
                    if($this->__loadToDB($newfilename, $client_filename)){
                        //Ghi nhận trạng thái thành công
                        $save_data = $this->GhiNhanTaiLen->find('first', array('conditions'=> 
                                        array('ten_tap_tin_client'=>$client_filename)));
                        $save_data['GhiNhanTaiLen']['tinh_trang'] = 1;
                        if(!empty($save_data)){
                            if(!$this->GhiNhanTaiLen->save($save_data)){
                                $this->redirect(array('action'=>'index'));
                                $this->Session->setFlash('Lỗi lưu trữ lên cơ sở dữ liệu!');
                            }
                        }
                        $this->Session->setFlash('Tải tập tin thành công!');
                    }else{
                        $this->redirect(array('action'=>'index'));
                        $this->Session->setFlash('Lỗi lưu trữ lên cơ sở dữ liệu!');
                    }
                }
            }else{
                $this->Session->setFlash($this->FileUpload->showErrors());
            }
        }
        
        $this->GhiNhanTaiLen->recursive = 0;
        $this->set('files', $this->paginate('GhiNhanTaiLen',
                                        array('GhiNhanTaiLen.canbo_id'=>$this->Auth->user('canbo_id'))));
    }

    
    //HAM IMP VAO CSDL
    function __loadToDB($filename, $oldfilename){
        $sheets = array();
        
        if(substr($oldfilename,0,1) == 'p'){
            $sheets = array(                        
                        0 => array('name'=>'phieudts','model'=>'PhieuDt'),
                        1 => array('name'=>'ketquas','model'=>'Ketqua')
                       
               );
        }elseif(substr($oldfilename,0,1) == 'b'){
            $sheets = array(    
                        0 => array('name'=>'pdtbds','model'=>'PDtBd'),
                        1 => array('name'=>'kqbds','model'=>'KqBd')                      
               );
        }elseif(substr($oldfilename,0,1) == 'd'){
            $sheets = array(     
                        0 => array('name'=>'dvtinhs','model'=>'Dvtinh'),                                             
                        1 => array('name'=>'sdungthuocs','model'=>'SdungThuoc'),
                        2 => array('name'=>'sdphanbons','model'=>'SdPhanbon'),
                        3 => array('name'=>'thoitiets','model'=>'Thoitiet'),
                        4 => array('name'=>'tstts','model'=>'TsTt')
                       
               );
        }elseif(substr($oldfilename,0,1) == 'n'){
            $sheets = array(   
                        0 => array('name'=>'nonghos','model'=>'Nongho'),
                       
                        1 => array('name'=>'sotays','model'=>'Sotay')
                       
               );
        }elseif(substr($oldfilename,0,1) == 'a'){//danh cho danh muc he thong-admin
            $sheets = array(   
                        0 => array('name'=>'dvtinhs','model'=>'Nongho'),
                        1 => array('name'=>'canbos','model'=>'Canbo'),
                        2 => array('name'=>'chicucbvtvs','model'=>'ChicucBvtv'),
                        3 => array('name'=>'diemdts','model'=>'DiemDt'),
                        4 => array('name'=>'doituongs','model'=>'Doituong'),
                        5 => array('name'=>'dtloaidts','model'=>'DtLoaidt'),
                        6 => array('name'=>'giongluas','model'=>'Gionglua'),
                        7 => array('name'=>'hcthuocs','model'=>'HcThuoc'),
                        8 => array('name'=>'hoatchats','model'=>'Hoatchat'),
                        9 => array('name'=>'huyens','model'=>'Huyen'),
                        10 => array('name'=>'loaidts','model'=>'LoaiDt'),
                        11 => array('name'=>'loaiphans','model'=>'Loaiphan'),
                        12 => array('name'=>'muavues','model'=>'MuaVue'),
                        13 => array('name'=>'nams','model'=>'Nam'),
                        14 => array('name'=>'nddts','model'=>'NdDt'),
                        15 => array('name'=>'nsses','model'=>'Nss'),
                        16 => array('name'=>'thongsos','model'=>'Thongso'),
                        17 => array('name'=>'thuocs','model'=>'Thuoc'),
                        18 => array('name'=>'tinhs','model'=>'Tinh'),
                        19 => array('name'=>'trambvtvs','model'=>'Trambvtv'),
                        20 => array('name'=>'users','model'=>'User'),
                        21 => array('name'=>'xas','model'=>'Xa')
                       
               );
        }else{
            return false; 
        }
               
        if($this->__saveDataFromFile($filename, $sheets))
            return true;
        else
            return false;
    }
    
    
    ////HAM IMP VAO CSDL
//    function __loadToDB($filename){
//        $sheets = array(    0 => array('name'=>'ketquas','model'=>'Ketqua'),
//                            1 => array('name'=>'kqbds','model'=>'KqBd'),
//                            2 => array('name'=>'nonghos','model'=>'NongHo'),
//                            3 => array('name'=>'pdtbds','model'=>'PDtBd'),
//                            4 => array('name'=>'phieudts','model'=>'PhieuDt'),
//                            5 => array('name'=>'sdungthuocs','model'=>'SdungThuoc'),
//                            6 => array('name'=>'sotays','model'=>'Sotay'),
//                            7 => array('name'=>'tstts','model'=>'TsTt'),
//                            8 => array('name'=>'dvtinhs','model'=>'Dvtinh')
//                   );       
//        
//        if($this->__saveDataFromFile($filename, $sheets))
//            return true;
//        else
//            return false;
//    }
    /**
     * GhiNhanTaiLensController::__saveDataFromFile()
     * 
     * Hàm này đọc dữ liệu từ 1 file excel, và lưu dữ liệu đó và các bảng trong CSDL
     * 
     * @param mixed $filename đường dẫn đến file excel
     * @param mixed $sheets tên của các sheets và model của từng sheet tương ứng trong file excel, 
     *          hàm sẽ đọc từng sheet một để load dữ liệu, mỗi sheet là 1 bảng.
     * @return true hoặc false
     * Ví dụ:
     * $sheets = array( 0 => array('name'=>'sotays','model'=>'Sotay'),
     *                  1 => array('name'=>'thoitiets','model'=>'Thoitiet')
     *              );
     * ketqua = $this->__saveDataFromFile($filename, $sheets);
     */
    function __saveDataFromFile($filename, $sheets){        
        $ExcelXMLParser = new ExcelXMLParser();
        $result = $ExcelXMLParser->openWorkbook($filename,array());
        
        if(!ExcelXMLError::isError($result)){
            $ws = &$ExcelXMLParser->Workbook->getWorksheetByName('ThongTin');
            $data = $this->__getDataFromWorkSheet($ws, 'ThongTin');
            if($data['ThongTin'][0]['UID'] != $this->Auth->user('id')){
                $this->Session->setFlash('Bạn không thể tải tập tin được xuất ra bởi người dùng khác');
                return false;
            }
            
            foreach($sheets as $order=>$sheet){
                $ws = &$ExcelXMLParser->Workbook->getWorksheetByName($sheet['name']);
                if(!empty($ws)){
                    $data = $this->__getDataFromWorkSheet($ws, $sheet['model'], array('canbo_id'=>$this->Auth->user('canbo_id')));
                    if(!empty($data)){
                        // AK AK KO HIỂU NỔI PHP HÂHHAHAHA
                        /**
                         * $ten='Nongho'
                         * $this->ten-> tuong duong $this->Nongho
                         * */
                        if(!$this->$sheet['model']->saveAll($data[$sheet['model']])){
                            //Debugger::dump($this->$sheet['model']);
                            $this->Session->setFlash('Gặp lỗi khi lưu dữ liệu vào model '.$sheet['model']);
                            return false;
                        }
                    }
                }else{
                    $this->Session->setFlash('Không tìm thấy sheet có tên '.$sheet['name'].' trong tập tin.');
                    return false;
                }
            }            
            return true;
        }else{
            $this->Session->setFlash('Lỗi phân tích tập tin vừa tải lên.');
            return false;
        }
    }
    
    /**
     * Tạo dữ liệu dạng Array('Tên Model' => array([0] => array(), [1]=>....))
     * để có thể lưu cùng lúc nhiều dòng dữ liệu
     * Xem saveAll tại http://book.cakephp.org/view/75/Saving-Your-Data
     * */
    function __getDataFromWorkSheet($ws, $modelName, $opt=null){
        $data = array();
        
        $headers = array();
        $infos = array();
        $irow = 0;
        $isfirstrow = true;
        //Moi file dc xuat ra se doc theo dang cau truc XML <data></data>
        $row = &$ws->Table->getFirstRow();
        while($row){
            $cell =& $row->getFirstCell();
            $col = 0;
            while($cell){
                if($isfirstrow){ // Đọc dòng header là tên của các cột trong bảng dữ liệu                       
                    $headers[$col++] = $cell->getValue();
                }else{
                    $data[$modelName][$irow][$headers[$col++]] = $cell->getValue();
                }
                $cell =& $row->getNextCell();                 
            }
            if($isfirstrow){                        
                $isfirstrow = false;
            }else{
                if(!empty($opt)){
                    foreach($opt as $att=>$val){
                        $data[$modelName][$irow][$att] = $val;
                    }
                }                
                $irow++;
            }
            $row =& $ws->Table->getNextRow();        
        }
        
        return $data;
    }
}
?>